/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package traspasos.beans;

import entities.Almacen;
import entities.LineaInventarioAlmacen;
import entities.LineaPeticionTraspasoMercancia;
import entities.PeticionTraspasoMercancia;
import entities.Producto;
import entities.ProductoTalla;
import entities.Usuario;
import facades.AlmacenFacade;
import facades.LineaInventarioAlmacenFacade;
import facades.LineaPeticionTraspasoMercanciaFacade;
import facades.PeticionTraspasoMercanciaFacade;
import javax.inject.Named;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.enterprise.event.Event;
import javax.enterprise.inject.spi.BeanManager;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.transaction.Transactional;
import productos.datamodel.FiltroProductos;
import qualifiers.EventoEntidadCreada;
import qualifiers.UsuarioLogeado;
import util.Utils;

/**
 *
 * @author damfercer
 */
@Named(value = "nuevaPeticionTraspasoMercancia")
@ViewScoped
public class NuevaPeticionTraspasoMercancia extends FiltroProductos implements Serializable {
    @Inject
    @UsuarioLogeado
    private Usuario usuario;
    private PeticionTraspasoMercancia peticionTraspasoMercancia;
    @Inject
    private PeticionTraspasoMercanciaFacade peticionTraspasoMercanciaFacade;
    @Inject
    private LineaPeticionTraspasoMercanciaFacade lineaPeticionTraspasoMercanciaFacade;
    @Inject
    AlmacenFacade almacenFacade;
    @Inject
    LineaInventarioAlmacenFacade lineaInventarioAlmacenFacade;
    @Inject
    @EventoEntidadCreada
    private Event<PeticionTraspasoMercancia> eventoNuevaPeticionTraspasoMercancia;
    @Inject BeanManager manager;
    /**
     * Creates a new instance of NuevaPeticionTraspasoMercancia
     */
    public NuevaPeticionTraspasoMercancia() {
    }
    
    @PostConstruct
    public void initialize(){
        peticionTraspasoMercancia=new PeticionTraspasoMercancia();
        peticionTraspasoMercancia.setImportancia(0);
        peticionTraspasoMercancia.setLineaPeticionTraspasoMercanciaList(new ArrayList<LineaPeticionTraspasoMercancia>());
    }
    
    public Boolean algunaLineaEsDistintaDeCero(){
        Boolean res=false;
        for (LineaPeticionTraspasoMercancia lineaPeticionTraspasoMercancia : peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList()) {
            if(lineaPeticionTraspasoMercancia.getCantidad()>0){
                return true;
            }
        }
        return res;
    }
    
    public void filtrarProductosTalla(){
        List<Producto> productos=this.filtrar();
        peticionTraspasoMercancia.setLineaPeticionTraspasoMercanciaList(new ArrayList<LineaPeticionTraspasoMercancia>());
        for (Producto producto : productos) {
            Collections.sort(producto.getProductoTallaList());
            for (ProductoTalla productoTalla : producto.getProductoTallaList()) {
                LineaPeticionTraspasoMercancia lp=new LineaPeticionTraspasoMercancia();
                lp.setPeticionTraspasoMercancia(peticionTraspasoMercancia);
                lp.setCantidad(0);
                lp.setProductoTalla(productoTalla);
                peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList().add(lp);
            }
        }
    }
    
    /**
     * @return the usuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the peticionTraspasoMercancia
     */
    public PeticionTraspasoMercancia getPeticionTraspasoMercancia() {
        return peticionTraspasoMercancia;
    }

    /**
     * @param peticionTraspasoMercancia the peticionTraspasoMercancia to set
     */
    public void setPeticionTraspasoMercancia(PeticionTraspasoMercancia peticionTraspasoMercancia) {
        this.peticionTraspasoMercancia = peticionTraspasoMercancia;
    }
    
    @Transactional
    public String guardar(){
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
        Locale locale=context.getViewRoot().getLocale();
        ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
        if(!algunaLineaEsDistintaDeCero()){
            FacesMessage msg =new FacesMessage("No se puede crear una petición sin productos");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, msg);
            context.renderResponse();
            return null;
        }
        List<LineaPeticionTraspasoMercancia> peticionesAdd=new ArrayList<LineaPeticionTraspasoMercancia>();
        Almacen almacenConTodosLosProductos=almacenFacade.getAlmacenVentasAleatorioConTodosLosProductosSinEsteAlmacen(peticionTraspasoMercancia.getAlmacen(),Utils.getMapLineas(peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList()));
        for(Iterator<LineaPeticionTraspasoMercancia> it = peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList().iterator(); it.hasNext();) {
            LineaPeticionTraspasoMercancia lineaPeticionTraspasoMercancia=it.next();
            if(lineaPeticionTraspasoMercancia.getCantidad()>0){
                if(almacenConTodosLosProductos!=null){
                    lineaPeticionTraspasoMercancia.setAlmacenEnvio(almacenConTodosLosProductos);
                    lineaPeticionTraspasoMercancia.setAlmacenEnvio(almacenFacade.getAlmacenReservaAsociado(almacenConTodosLosProductos));
                }
                else{
                    List<LineaPeticionTraspasoMercancia> lineasPet=new ArrayList<LineaPeticionTraspasoMercancia>();
                    lineasPet.add(lineaPeticionTraspasoMercancia);
                    Almacen almacenConEsteProductoTalla=almacenFacade.getAlmacenVentasAleatorioConTodosLosProductosSinEsteAlmacen(peticionTraspasoMercancia.getAlmacen(), Utils.getMapLineas(lineasPet));
                    if(almacenConEsteProductoTalla!=null){
                        lineaPeticionTraspasoMercancia.setAlmacenEnvio(almacenFacade.getAlmacenReservaAsociado(almacenConEsteProductoTalla));
                    }
                    else{
                        //Lógica de separar las mierdas
                        Integer cantidadRestantePorEnviar=lineaPeticionTraspasoMercancia.getCantidad();
                        List<LineaInventarioAlmacen> lineasInventarioConProductoTalla=lineaInventarioAlmacenFacade.getLineaInventarioDeAlmacenConProductoYCantidadOMasSinAlmacen(lineaPeticionTraspasoMercancia.getProductoTalla(), 1,peticionTraspasoMercancia.getAlmacen());
                        for (LineaInventarioAlmacen lineaInventarioAlmacen : lineasInventarioConProductoTalla) {
                            if(cantidadRestantePorEnviar!=0){
                                Integer cantidadQueEnvia=Math.min(cantidadRestantePorEnviar, lineaInventarioAlmacen.getCantidad());
                                LineaPeticionTraspasoMercancia lineaSeparada=new LineaPeticionTraspasoMercancia();
                                lineaSeparada.setCantidad(cantidadQueEnvia);
                                lineaSeparada.setPeticionTraspasoMercancia(peticionTraspasoMercancia);
                                lineaSeparada.setProductoTalla(lineaPeticionTraspasoMercancia.getProductoTalla());
                                lineaSeparada.setAlmacenEnvio(almacenFacade.getAlmacenReservaAsociado(lineaInventarioAlmacen.getAlmacen()));
                                peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList().add(lineaSeparada);
                                cantidadRestantePorEnviar-=cantidadQueEnvia;
                            }
                            else{
                                break;
                            }
                        }
                        if(cantidadRestantePorEnviar>0){
                            LineaPeticionTraspasoMercancia lineaSeparada=new LineaPeticionTraspasoMercancia();
                            lineaSeparada.setCantidad(cantidadRestantePorEnviar);
                            lineaSeparada.setPeticionTraspasoMercancia(peticionTraspasoMercancia);
                            lineaSeparada.setProductoTalla(lineaPeticionTraspasoMercancia.getProductoTalla());
                            lineaSeparada.setAlmacenEnvio(null);
                            peticionesAdd.add(lineaSeparada);
                        }
                        it.remove();
                    }
                }
            }
            else{
                it.remove();
            }
        }
        peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList().addAll(peticionesAdd);
        peticionTraspasoMercancia.setFechaCreacion(new Date());
        peticionTraspasoMercancia.setUsuarioCreador(usuario);
        peticionTraspasoMercanciaFacade.create(peticionTraspasoMercancia);
        eventoNuevaPeticionTraspasoMercancia.fire(peticionTraspasoMercancia);
        this.peticionTraspasoMercancia=new PeticionTraspasoMercancia();
        return "/views/tienda/Traspasos?faces-redirect=true";
    }    
    
    
    /*public void generarNuevaLineaPeticion(@Observes @EventoPeticionNoSatisfecha LineaEnvioTraspasoMercancia lineaEnvio){
        Integer cantidadNoSatisfecha=lineaEnvio.getLineaPeticionTraspasoMercancia().getCantidad()-lineaEnvio.getCantidad();
        LineaPeticionTraspasoMercancia nuevaLineaPeticion=new LineaPeticionTraspasoMercancia();
        nuevaLineaPeticion.setCantidad(cantidadNoSatisfecha);
        nuevaLineaPeticion.setPeticionTraspasoMercancia(lineaEnvio.getLineaPeticionTraspasoMercancia().getPeticionTraspasoMercancia());
        nuevaLineaPeticion.setProductoTalla(lineaEnvio.getProductoTalla());
        List<LineaPeticionTraspasoMercancia> lineasPet=new ArrayList<LineaPeticionTraspasoMercancia>();
        lineasPet.add(nuevaLineaPeticion);
        Almacen almacenConEsteProductoTalla=almacenFacade.getAlmacenVentasAleatorioConTodosLosProductosSinEsteAlmacen(lineaEnvio.getLineaPeticionTraspasoMercancia().getPeticionTraspasoMercancia().getAlmacen(),getMapLineas(lineasPet));
        //Almacen almacenConEsteProductoTalla=getAlmacenAleatorioConLineaPeticionSinEsteAlmacen(nuevaLineaPeticion,lineaEnvio.getLineaPeticionTraspasoMercancia().getPeticionTraspasoMercancia().getAlmacen());
        if(almacenConEsteProductoTalla!=null){
            nuevaLineaPeticion.setAlmacenEnvio(almacenConEsteProductoTalla);
            eventoPreCrearLineaPeticionTraspasoMercancia.fire(nuevaLineaPeticion);
            nuevaLineaPeticion.setAlmacenEnvio(almacenFacade.getAlmacenReservaAsociado(almacenConEsteProductoTalla));
            lineaPeticionTraspasoMercanciaFacade.create(nuevaLineaPeticion);
            if(nuevaLineaPeticion.getPeticionTraspasoMercancia().getLineaPeticionTraspasoMercanciaList()==null){
                nuevaLineaPeticion.getPeticionTraspasoMercancia().setLineaPeticionTraspasoMercanciaList(new ArrayList<LineaPeticionTraspasoMercancia>());
            }
            nuevaLineaPeticion.getPeticionTraspasoMercancia().getLineaPeticionTraspasoMercanciaList().add(nuevaLineaPeticion);
            eventoNuevaLineaPeticionTraspasoMercancia.fire(nuevaLineaPeticion);
        }
        else{
            //Lógica de separar las mierdas
            Integer cantidadRestantePorEnviar=nuevaLineaPeticion.getCantidad();
            List<LineaInventarioAlmacen> lineasInventarioConProductoTalla=lineaInventarioAlmacenFacade.getLineaInventarioDeAlmacenConProductoYCantidadOMasSinAlmacen(nuevaLineaPeticion.getProductoTalla(), 1,lineaEnvio.getLineaPeticionTraspasoMercancia().getPeticionTraspasoMercancia().getAlmacen());
            for (LineaInventarioAlmacen lineaInventarioAlmacen : lineasInventarioConProductoTalla) {
                if(cantidadRestantePorEnviar!=0){
                    Integer cantidadQueEnvia=Math.min(cantidadRestantePorEnviar, lineaInventarioAlmacen.getCantidad());
                    LineaPeticionTraspasoMercancia lineaSeparada=new LineaPeticionTraspasoMercancia();
                    lineaSeparada.setAlmacenEnvio(lineaInventarioAlmacen.getAlmacen());
                    lineaSeparada.setCantidad(cantidadQueEnvia);
                    lineaSeparada.setPeticionTraspasoMercancia(nuevaLineaPeticion.getPeticionTraspasoMercancia());
                    lineaSeparada.setProductoTalla(nuevaLineaPeticion.getProductoTalla());
                    eventoPreCrearLineaPeticionTraspasoMercancia.fire(lineaSeparada);
                    lineaSeparada.setAlmacenEnvio(almacenFacade.getAlmacenReservaAsociado(lineaInventarioAlmacen.getAlmacen()));
                    lineaPeticionTraspasoMercanciaFacade.create(lineaSeparada);
                    peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList().add(lineaSeparada);
                    eventoNuevaLineaPeticionTraspasoMercancia.fire(lineaSeparada);
                }
                else{
                    break;
                }
            }
        }
    }*/
}
